/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ui;

import edu.ucue.ptc.gco.mdl.Ciudad;
import edu.ucue.ptc.gco.mdl.Cliente;
import edu.ucue.ptc.gco.mdl.Direccion;
import edu.ucue.ptc.gco.ngc.CiudadManagerLocal;
import edu.ucue.ptc.gco.ngc.ClienteManagerLocal;
import edu.ucue.ptc.gco.ngc.DireccionManagerLocal;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import edu.ucue.ptc.gco.util.DireccionValidadorException;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.primefaces.context.RequestContext;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.event.map.StateChangeEvent;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.LatLngBounds;
import org.primefaces.model.map.MapModel;

/**
 *
 * @author DELL
 */
@Named(value = "DireccionAction")
@SessionScoped
public class DireccionAction implements Serializable {


    @Inject
    private DireccionManagerLocal direccionManager;
    private Direccion direccion;
    private List<Direccion> direcciones;
    
    @Inject
    private CiudadManagerLocal ciudadManager;  

    private boolean modomodificar=false;
    
    //private ListDataModel<Cliente> listModel; 
    
    public List<Direccion> getDirecciones() {
        return direcciones;
    }

    public void setDirecciones(List<Direccion> direcciones) {
        this.direcciones = direcciones;
    }

    public boolean isModomodificar() {
        return modomodificar;
    }

    public void setModomodificar(boolean modomodificar) {
        this.modomodificar = modomodificar;
    }        
    
    private Ciudad ciudadsel;    
    private List<Ciudad> ciudades;
    
    @Inject
    private ClienteManagerLocal clienteManager;
    
    private Cliente clientesel;    
    private List<Cliente> clientes;

    /**
     * Creates a new instance of direccionAction
     */
    public DireccionAction() {
        direccion=new Direccion();
        
        //Shared coordinates  
        LatLng coord1 = new LatLng(36.879466, 30.667648);  
        LatLng coord2 = new LatLng(36.883707, 30.689216);  
        LatLng coord3 = new LatLng(36.879703, 30.706707);  
        LatLng coord4 = new LatLng(36.885233, 30.702323);  

    }
    
    public static DireccionAction getInstance()
    {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{DireccionAction}", DireccionAction.class);
        return (DireccionAction)ex.getValue(context);
    }
    
    public String guardar() {            
        try {
            
            if (!modomodificar) {
                direccion.setCiudad(ciudadsel);
                direccionManager.crear(direccion, LoginAction.getUsername(),LoginAction.getPassword());
                addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "AÑADIR DIRECCION", "DIRECCION CREADO CORRECTAMENTE")); 
            } else {
                modificarCliente(direccion);
                modomodificar = false;
                RequestContext.getCurrentInstance().update("tablaP");
                return "listadireccion";
            }                                                            
        } catch (DireccionValidadorException ex) {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "AÑADIR DIRECCION", "ERROR: "+ ex.toString())); 
        }    
        catch (Exception ex) {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "AÑADIR DIRECCION", "ERROR: "+ ex.toString())); 
        } 
        return "";
    }
    
    public String eliminar(Direccion direccionMod) {
    try {                
        String resp=direccionManager.eliminarDireccion(direccionMod,LoginAction.getUsername(),LoginAction.getPassword());
        if (resp.compareTo("ok")==0)
        {
            //addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "ELIMINAR CLIENTE", "CLIENTE ELIMINADO CORRECTAMENTE")); 
            direcciones.remove(direccionMod);
        }                               
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "ELIMINAR DIRECCION", "DIRECCION ELIMINADA CORRECTAMENTE")); 
    } catch (Exception ex) {
        addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "ELIINAR DIRECCION", "ERROR: "+ ex.toString())); 
    }        
        return "listadireccion";
    }

    public String modificarCliente(Direccion direccionMod) {
        direccion = direccionMod;
        try {
            Direccion c = direccionManager.actualizar(direccion, LoginAction.getUsername(), LoginAction.getPassword());
            if (c != null) {
                addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "MODIFICAR DIRECCION", "DIRECCION MODIFICADA CORRECTAMENTE"));
            }
        } catch (Exception ex) {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "MODIFICAR DIRECCION", "NO SE PUDO MODIFICAR REGISTRO, ERROR: " + ex.toString()));
        }
        return "Direccion";
    }
    
     public void onStateChange(StateChangeEvent event) {  
        LatLngBounds bounds = event.getBounds();  
        int zoomLevel = event.getZoomLevel();  
          
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Zoom Level", String.valueOf(zoomLevel)));  
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Center", event.getCenter().toString()));  
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "NorthEast", bounds.getNorthEast().toString()));  
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "SouthWest", bounds.getSouthWest().toString()));  
    }
    
    public void onPointSelect(PointSelectEvent event) {  
        LatLng latlng = event.getLatLng();  
        direccion.setLatitud(String.valueOf(latlng.getLat()));
        direccion.setLongitud(String.valueOf(latlng.getLng()));        
        RequestContext.getCurrentInstance().update(":lat");
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Punto Seleccionado", "Lat:" + latlng.getLat() + ", Lng:" + latlng.getLng()));                  
    }
    
    private MapModel simpleModel;  
  
    public MapModel getSimpleModel() {  
        return simpleModel;  
    }          
    
    public void addMessage(FacesMessage message) {  
        FacesContext.getCurrentInstance().addMessage(null, message);  
    } 
    
     public void cargaLista() {
        try {
            direcciones = direccionManager.listarTodos(LoginAction.getUsername(),LoginAction.getPassword());
        } catch (Exception ex) {
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
         
    @PostConstruct
    public void init() {                    
        try {                                    
            clientes = clienteManager.listar(LoginAction.getUsername(), LoginAction.getPassword());
            ciudades = ciudadManager.listarCiudades();               
        } catch (AtributoInvalidoException ex) {
            Logger.getLogger(DireccionAction.class.getName()).log(Level.SEVERE, null, ex);
        }
        cargaLista();
    }

    public CiudadManagerLocal getCiudadManager() {
        return ciudadManager;
    }

    public void setCiudadManager(CiudadManagerLocal ciudadManager) {
        this.ciudadManager = ciudadManager;
    }

    public List<Ciudad> getCiudades() {
        return ciudades;
    }

    public void setCiudades(List<Ciudad> ciudades) {
        this.ciudades = ciudades;
    }
   
    public Ciudad getCiudadsel() {
        return ciudadsel;
    }

    public void setCiudadsel(Ciudad ciudadsel) {
        this.ciudadsel = ciudadsel;
    }
    
    public DireccionManagerLocal getDireccionManager() {
        return direccionManager;
    }

    public void setDireccionManager(DireccionManagerLocal direccionManager) {
        this.direccionManager = direccionManager;
    }

    public Direccion getDireccion() {
        return direccion;
    }

    public void setDireccion(Direccion direccion) {
        this.direccion = direccion;
    }

    public ClienteManagerLocal getClienteManager() {
        return clienteManager;
    }

    public void setClienteManager(ClienteManagerLocal clienteManager) {
        this.clienteManager = clienteManager;
    }

    public Cliente getClientesel() {
        return clientesel;
    }

    public void setClientesel(Cliente clientesel) {
        this.clientesel = clientesel;
    }

    public List<Cliente> getClientes() {
        return clientes;
    }

    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }
    
    public String cancel() {
        return "index";
    }
    
    public String añadirCliente()
    {
        direccion.setPersona(clientesel);
        return "Direccion";
    }
    
    public String añadirNuevoCliente()
    {
        try {
            clientes= clienteManager.listar(LoginAction.getUsername(), LoginAction.getPassword());
        } catch (AtributoInvalidoException ex) {
            Logger.getLogger(DireccionAction.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "Direccion";
    }

    public String añadirNuevoClienteAgregar(Cliente cliente)
    {
        setClientesel(cliente);
        direccion.setPersona(cliente);
        return "Direccion";
    }
    
    public String modificar(Direccion direccionMod) {
        direccion = direccionMod;
        modomodificar = true;
        return "Direccion";
    }
    
}
